package com.chenbei.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.chenbei.common.domain.vo.UploadFileResult;
import com.chenbei.system.domain.SysUser;
import com.chenbei.system.vo.req.SysUserReq;
import com.chenbei.system.vo.resp.AdminUserMenuResp;
import com.chenbei.system.vo.resp.SysUserSelectorDataResp;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 后台管理用户接口服务
 */
public interface ISysUserService extends IService<SysUser> {

    /**
     * 通过登陆名获取用户信息
     * @param loginName 登陆名称(用户名｜邮箱｜手机号)
     * @return SysAdminUser
     */
    SysUser getByLoginName(String loginName);

    /**
     * 通过主键获取用户信息
     * @param id 管理员用户ID
     * @return SysAdminUser
     */
    SysUser detail(Long id);

    /**
     * 添加管理员
     * @param sysUser 管理员用户
     * @return SysAdminUser
     */
    SysUser add(SysUser sysUser);

    /**
     * 管理员分页
     * @param sysUserReq 查询实例
     * @return Page
     */
    IPage<SysUser> page(SysUserReq sysUserReq);

    /**
     * 列表
     * @param sysUserReq 查询实例
     * @return List
     */
    List<SysUser> list(SysUserReq sysUserReq);

    /**
     * 更新管理员
     *
     * @param sysUser 管理员用户实例
     */
    void update(SysUser sysUser);

    /**
     * 删除管理员用户
     * @param id 管理员用户ID
     */
    void delete(long id);

    /**
     * 绑定邮箱
     * @param id 用户ID
     * @param email 邮箱地址
     */
    void bindEmail(long id, String email);

    /**
     * 绑定手机号
     * @param id 用户ID
     * @param phone 用户号码
     */
    void bindPhone(long id, String phone);

    /**
     * 修改密码
     * @param id 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     */
    void modifyPassword(long id, String oldPassword, String newPassword);

    /**
     * 重置密码
     * @param id 用户ID
     */
    void resetPassword(long id);

    /**
     * 对称性加密
     * @param sourcePassword 原始密码
     * @return String
     */
    String encodePassword(String sourcePassword);

    /**
     * 检查密码
     * @param sourcePassword 原始密码
     * @param encodePassword 密文密码
     * @return boolean
     */
    boolean checkPassword(String sourcePassword, String encodePassword);

    /**
     * 上传头像
     * @param file 文件
     * @return UploadFileResult
     */
    UploadFileResult uploadAvatar(MultipartFile file);

    /**
     * 获取管理员用户的菜单列表
     * @param id 管理员ID
     * @return List
     */
    List<AdminUserMenuResp> listAdminUserMenus(Long id);

    /**
     * 通过组织PID获取子组织以及用户信息
     * @param orgPid 父ID
     * @return List
     */
    List<SysUserSelectorDataResp> listSysUserSelectorData(Long orgPid);
}
